package com.fileupload.process.strategy;

import com.fileupload.common.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * 基于时间的不同目录移动策略实现
 * 将文件移动到不同的目标目录，并按日期创建子目录结构
 */
public class DiffMoveTimeFileStrategy extends AbstractFileFinishActionStrategy {

    private static final Logger logger = LoggerFactory.getLogger(DiffMoveTimeFileStrategy.class);
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    /**
     * 默认构造函数
     */
    public DiffMoveTimeFileStrategy() {
        super("diff-move-time");
    }
    
    /**
     * 构造函数
     * 
     * @param monitorDir 监控目录
     */
    public DiffMoveTimeFileStrategy(String monitorDir) {
        super("diff-move-time", monitorDir);
    }

    @Override
    public boolean execute(File file, String targetDir) {
        logger.debug("执行基于时间的不同目录移动操作: 文件={}, 目标目录={}", file.getAbsolutePath(), targetDir);
        
        if (file == null || !file.exists()) {
            logger.error("文件不存在: {}", file);
            return false;
        }
        
        if (targetDir == null || targetDir.trim().isEmpty()) {
            logger.error("目标目录不能为空");
            return false;
        }
        
        try {
            // 获取当前日期，用于创建子目录
            String currentDate = LocalDate.now().format(DATE_FORMATTER);
            
            // 构建带时间戳的目标路径
            Path timeBasedPath = Paths.get(targetDir, currentDate);
            
            // 确保目标目录存在
            FileUtils.ensureDirectoryExists(timeBasedPath);
            
            // 目标文件路径
            Path destination = timeBasedPath.resolve(file.getName());
            
            // 移动文件
            Files.move(file.toPath(), destination);
            logger.info("文件基于时间移动成功: 从={} 到={}", file.getAbsolutePath(), destination);
            return true;
        } catch (IOException e) {
            logger.error("基于时间移动文件失败: {}", e.getMessage(), e);
            return false;
        }
    }
}